﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using FrameworkLib.Facades;
using GestionePolveri2.DAL;
using GestionePolveriLib.BL;

namespace GestionePolveriLib.Facades
{
    public class LottoNCFacade : FacadeBase<GestionePolveriEntities>
    {
        GestionePolveriEntities context = null;

        public LottoNCFacade()
        {
            context = this.GetContext();
        }

        public LottoNCFacade(string connectionString)
        {
            context = this.GetContext(connectionString);
        }

        public bool Add(LottoNCInfo data)
        {
            bool retValue = false;

            try
            {
                LottiNC m_lottoNC = new LottiNC();
                m_lottoNC.FlagBlocco = data.IsLottoBloccato.GetValueOrDefault();
                m_lottoNC.FlagNC = data.IsLottoNC.GetValueOrDefault();
                m_lottoNC.IDLotto = data.IDLotto;
                m_lottoNC.Note = data.Note;
                m_lottoNC.IDOperatore = data.IDOperatore;

                context.LottiNC.AddObject(m_lottoNC);
                context.SaveChanges();

                retValue = true;
            }
            catch (Exception ex)
            {
                this.LastExceptionOccurred = ex;
                throw;
            }

            return retValue;
        }

        public bool Modify(LottoNCInfo data)
        {
            bool retValue = false;

            try
            {
                var obj = from x in context.LottiNC
                          where x.IDLotto == data.IDLotto
                          select x;

                if (obj.Any())
                {
                    LottiNC m_lottoNC = obj.FirstOrDefault();

                    m_lottoNC.FlagBlocco = data.IsLottoBloccato.GetValueOrDefault();
                    m_lottoNC.FlagNC = data.IsLottoNC.GetValueOrDefault();
                    m_lottoNC.Note = data.Note;
                    m_lottoNC.IDOperatore = data.IDOperatore;

                    context.SaveChanges();

                    retValue = true;
                }
            }
            catch (Exception ex)
            {
                this.LastExceptionOccurred = ex;
                throw;
            }

            return retValue;
        }

        public bool AddOrModify(LottoNCInfo data)
        {
            bool retValue = false;

            try
            {
                var obj = from x in context.LottiNC
                          where x.IDLotto == data.IDLotto
                          select x;

                if (obj.Any())
                {
                    retValue = Modify(data);
                }
                else
                {
                    retValue = Add(data);
                }
            }
            catch (Exception ex)
            {
                this.LastExceptionOccurred = ex;
                throw;
            }

            return retValue;
        }

        public List<Lotto> GetLotti(long idpolvere)
        {
            List<Lotto> retValue = null;
            try
            {
                var obj = from x in context.Lotti
                          where x.IDPolvere == idpolvere && x.Giacenza != 0
                          orderby x.DataDdt
                          select new Lotto
                          {
                              IDLotto = x.IDLotto,
                              CodLotto = x.CodLotto,
                              DataDdt = x.DataDdt,
                              NumDdt = x.NumDdt,
                              DataScadenzaLotto = x.DataScadenzaLotto,
                              Giacenza = x.Giacenza,
                              GiacenzaIniziale = x.Giacenza_iniziale,
                              IDPolvere = x.IDPolvere,
                              NumFattura = x.NumFattura,
                              DataFattura = x.DataFattura,
                              CodicePolvere = x.AnagPolveri.CodicePolvere,
                              Fornitore = x.AnagPolveri.AnagFornitori.Descrizione,
                              PrezzoUnitario = x.PrezzoUnitario,
                              NoteCarico = (from m in context.Movimenti where m.IDLotto == x.IDLotto select m.Note).FirstOrDefault(),
                              QuantitaFatt = (!x.QuantitaFatt.HasValue ? x.Giacenza_iniziale : x.QuantitaFatt),
                              IDFattura = x.IDFattura,
                              LottoNCInfo = (from nc in context.LottiNC
                                             where nc.IDLotto == x.IDLotto
                                             select new LottoNCInfo
                                             {
                                                 IDLotto = nc.IDLotto,
                                                 IsLottoBloccato = nc.FlagBlocco,
                                                 IsLottoNC = nc.FlagNC
                                             }).FirstOrDefault()
                          };

                if (obj.Any())
                {
                    retValue = obj.ToList();
                }
            }
            catch (Exception ex)
            {
                // throw ex;
            }

            return retValue;
        }

        public List<Lotto> GetLotti(long idpolvere, bool blocked)
        {
            List<Lotto> retValue = null;
            try
            {
                var obj = from x in context.Lotti
                          where x.IDPolvere == idpolvere && x.Giacenza != 0 && x.LottiNC.FlagBlocco == blocked
                          orderby x.DataDdt
                          select new Lotto
                          {
                              IDLotto = x.IDLotto,
                              CodLotto = x.CodLotto,
                              DataDdt = x.DataDdt,
                              NumDdt = x.NumDdt,
                              DataScadenzaLotto = x.DataScadenzaLotto,
                              Giacenza = x.Giacenza,
                              GiacenzaIniziale = x.Giacenza_iniziale,
                              IDPolvere = x.IDPolvere,
                              NumFattura = x.NumFattura,
                              DataFattura = x.DataFattura,
                              CodicePolvere = x.AnagPolveri.CodicePolvere,
                              Fornitore = x.AnagPolveri.AnagFornitori.Descrizione,
                              PrezzoUnitario = x.PrezzoUnitario,
                              NoteCarico = (from m in context.Movimenti where m.IDLotto == x.IDLotto select m.Note).FirstOrDefault(),
                              QuantitaFatt = (!x.QuantitaFatt.HasValue ? x.Giacenza_iniziale : x.QuantitaFatt),
                              IDFattura = x.IDFattura,
                              LottoNCInfo = (from nc in context.LottiNC
                                             where nc.IDLotto == x.IDLotto
                                             select new LottoNCInfo
                                             {
                                                 IDLotto = nc.IDLotto,
                                                 IsLottoBloccato = nc.FlagBlocco,
                                                 IsLottoNC = nc.FlagNC
                                             }).FirstOrDefault()
                          };

                if (obj.Any())
                {
                    retValue = obj.ToList();
                }
            }
            catch (Exception ex)
            {
                // throw ex;
            }

            return retValue;
        }

        public LottoNCInfo GetLottoNC(long idLotto)
        {
            LottoNCInfo retValue = null;
            try
            {
                var obj = from x in context.LottiNC
                          where x.IDLotto == idLotto
                          select new LottoNCInfo
                          {
                              IDLotto = x.IDLotto,
                              IsLottoBloccato = x.FlagBlocco,
                              IsLottoNC = x.FlagNC,
                              IDOperatore = x.IDOperatore,
                              Note = x.Note
                          };

                if (obj.Any())
                {
                    retValue = obj.FirstOrDefault();
                }
            }
            catch (Exception ex)
            {
                // throw ex;
            }

            return retValue;
        }

        public double GetQuantitaBlocked(int idPolvere)
        {
            double retValue = 0;

            try
            {
                var obj = (from x in context.LottiNC
                          where x.Lotti.IDPolvere == idPolvere && x.FlagBlocco
                          select (double?)x.Lotti.Giacenza).Sum() ?? 0;

                retValue = (double)obj;
            }
            catch (Exception ex)
            {
                this.LastExceptionOccurred = ex;
                throw;
            }
           
            return retValue;
        }
    }
}
